package cn.tedu.oop3;
/*本类用作多态的入门案例*/
public class TestDemo {
    public static void main(String[] args) {
        //6.创建"纯纯的"对象用于测试
        /*Animal a = new Animal();
        Cat c = new Cat();
        Dog d = new Dog();

        a.eat();//调用父类自己的功能
        a.sleep();
        System.out.println(a.i);

        c.eat();//调用子类重写后的功能
        c.jump();
        System.out.println(c.i);*/
        //d.eat();//调用子类重写后的功能
        /*2.父类对象不可以使用子类的特有功能*//*
        //a.jump();//报错:Animal父类里没有这个方法
        //a.run();//报错:Animal父类里没有这个方法
        c.jump();//子类可以调用自己的功能
        d.run();//子类可以调用自己的功能*/

        //7.创建多态对象进行测试
        /*3.口诀1:父类引用指向子类对象
         * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/
        Animal a2 = new Cat();//Cat类对象的地址值交给父类类型变量a2来保存
//        Animal a3 = new Dog();//Dog类对象的地址值交给父类类型变量a3来保存
        /*口诀2:编译看左边,运行看右边
        解释:必须要在父类中定义这个方法,才能通过编译,把多态对象看做是父类类型
            必须要在子类中重写这个方法,才能满足多态,实际干活的是子类
        * */
        a2.eat();//小猫爱吃小鱼干!多态对象使用的是父类的定义,子类的方法体
        //a2.jump();
        a2.sleep();
        System.out.println(a2.i);

        System.out.println(a2.hashCode());//通过hashcode()方法,ctrl+right click, 找到自动导的lang包下面的Object类,

       /* a3.eat();
        //a3.run();
        a3.sleep();
        System.out.println(a3.i);*/


    }
}
/*1.多态的前提:继承+重写*/
//1.创建父类
class Animal{
    int i = 1;
    //3.创建父类的普通方法
    public void eat(){
        System.out.println("小动物Animal吃啥都行~");
    }

    public void sleep(){
        System.out.println("小动物All animal will sleep~~");
    }


}
//2.1创建子类1小猫类
class Cat extends Animal{
    int i = 2;
    //4.1添加重写的方法
    @Override //语法+程序员方便看
    public void eat(){
        System.out.println("小猫爱吃小鱼干~");
    }
    //5.1添加子类的特有方法
    public void jump(){
        System.out.println("小猫Cat跳的老高啦~");
    }
}
//2.2创建子类2小狗类
class Dog extends Animal{
    int i = 3;
    //4.2添加重写的方法
    @Override
    public void eat(){
        System.out.println("小狗爱吃肉骨头~");
    }
    //5.2添加子类的特有方法
    public void run(){
        System.out.println("小狗Dog跑的老快啦");
    }
}